23
תגובות
אני תוהה איך עובד הטיימליין של פייסבוק, הרי מדובר שם בנתונים ממספר טבלאות: שיתופים, סטטוסים, "X אהב את התמונה של Y", "X הגיב על התמונה שY" ועוד.

כנראה לא מדובר בשאילתה אחת, אבל בכל זאת, איך אני מבצע מספר שאילתות ועושה לכולם ORDER אחד? (לפי TIME לדוגמה), ובכלל איך נראות סוג כזה של שאילתות.

23 תשובות

avatar ענה iiddaannyy ב 24 ליולי 2013 #

אם אני לא טועה הם משתמשים במסד nosql בשביל הפעילות השוטפת של שמירת הנתונים ושליפתם.

אבל אם להתייחס לשאלה ספציפית של איך למיין, אתה שולף את הכל ואחר כך מבצע order by לעמודה של הזמן.
למקום הזה נכנסות תת שאילתות.

avatar ענה matan sh ב 24 ליולי 2013 #

אני לא חושב שהם משתמשים ב-NOSQL מהסיבה הפשוטה, כיהנתונים לא נשמרים אצל הלקוח.

לפי דעתי הם יוצרים טבלה בנפרד לכל הלייקים ששם הם מכניסים בכל שורה: מי עשה לייק, למי עשה לייק, הזמן שעשה ועוד כמה דברים שיעזרו להם להבין.
מתי שהם שולפים את כמות הלייקים הם פשוט ממספרים את הלייקים שעשו בחתך פוסטים. וכאשר אתה לוחץ על הלייקים כדי לדעת מי עשה לייק לפסוט מסויים, הוא פשוט מציג מאותה טבלה את האנשים שעשו לייק (בשונה מהפעם הראשונה שמשם הא הוציא רק את מספר האנשים שעשו לייק)

עכשיו בעניין השאלה הנשאלת, זה נראה לי הלוח שבצד שמאל למעלה שמראה לך פעולות של חברים בפייסבוק. לפי מיטב הבנתי, הפייסבוק משתמש בשיטת "דחיפת מידע", כך שהוא לא באמת צריך לשמור דברים כאלה. כל פעם שחבר שלך עושה פעולה זה דוחף לכל החברים שלו מה הוא עשה. לכן זה מוצג "און ליין" בלוח שבצד שמאל מעל הצ'אט. יתכן גם שהפייסבוק שומר את המידע אבל שאלות כמו איך? או למה?, צריך לשאול את מרק צוקרברג.

avatar ענה mmm ב 24 ליולי 2013 #

אני לא מתעניין בשיטות העבודה של מארק :), מה שכן, אני צריך לבנות קיר כזה, ואין לי כיוון אפילו מאיפה להתחיל.
אני לא מתיימר לבנות רשת חברתית לפני שכולם יקפצו עלי, אבל אני אתן לכם דוגמה שמשקפת את הבעיה שלי.
נדמיין מערכת כמו אינסטגרם, חבר העלה תמונה - "X העלה תמונה חדשה".
חבר אהב תמונה של מישהו אחר "X אהב את התמונה של Y".
חבר הגיב על תמונה של אחר: "X הגיב על התמונה של Y".
עכשיו שימו לב, שלא כל הפעולות מגיעות מאותו סוג של ACTIVITY, כי העלאת תמונה למשל, לא תכנס לטבלת הלייקים.
מצד שני, הם מופיעים בסדר הביצוע שלהם, מסודרים לפי זמן.

אני ממש אשמח אם מישהו יאיר את עיניי..

avatar ענה iiddaannyy ב 24 ליולי 2013 #

שולפים עם union את כל הנתונים שאתה רוצה מעל הטבלאות (וכמובן גם את עמודת הזמן) ואז ממיינים לפי זמן.

avatar ענה mmm ב 24 ליולי 2013 #

האמת שלא יצא לי אף פעם (אוי לבושה) להשתמש במיזוג בין שאילתות.
אני אשמח לדוגמה של שאילתה עם union.
תודה רבה!

avatar ענה matan sh ב 24 ליולי 2013 #

א. אני אמליץ לך ללמוד knockout.js זה יהפוך לך את החיים ליותר קלים ויהיה לך יותר קל לדחוף נתונים ומה שיותר טוב בזה שזה הכל יהיה בזמן אמת (כמו הפייסבוק לצורך העניין)

ב. חשבתי על דרך, קצת בעייתית לפי דעתי כי היא נראה לי בזבזנית אבל אולי זה יפתח לך את המוזה,
מכיר observer? גם אם לא אפשר לעשות את זה בדרך הישנה.
נניח שמישהו לחץ לייק על משהו מסויים. ברגע שהוא לוחץ לייק, מתחיל תהליך של "הודעה" (הכוונה להודיע).
אתה יוצר טבלה של הודועות ושם כל שורה מתייחסת למישהו מסויים ומודיעה לו מידע מסויים.
עכשיו, נחזור לבחורצ'יק שעשה לייק, כאשר הוא עושה לייק אתה שולף מטבלת החברים שלו את כל האיידי שלהם (בהנחה שאתה מקשר אנשים באצעות איידי, אם לא תבחר מה שבא לך שמקשר בניהם). לאחר מכן, אתה מכניס כמספר החברים את מס' שורות לטבלה של ההודעות ושם כל הודעה מתייחסת לאחד שאליו היא נשלחה.
לדוגמא: אני חבר שלך, אתה עשיתה לייק על פוסט מסויים. כאשר נשלפים אירועים/ הודעות מטבלת ההוודעות אני מקבל הודעה "mmm עשה לייק לתמונה של iiddaannyy" כי זה מה שהוכנס לטבלה. אני מניח שאיך להכניס את ההודעה לטבלה כך שככה זה יצא אני לא צריך להסביר לך.
ועכשיו כל מה שנותר לך זה לשלוף כל פעם מחדש מהטבלה את העידכונים או הכל (תלוי מה בא לך) שמוכוונים לאותו משתמש ולהציג אותם.
הסדר הוא בעיקרון יכול להיות זמנים או הסדר שבהם זה הוכנס לטבלה, תסדר את זה איך שבא לך.

ושוב, זאת דרך טיפה בעייתי כי הטבלה של ההודעות מסוגלת להיות ענקית בצורה מפחידה. אז תנסה אולי לחשוב על דרך אחרת לאחסון ההודעות אבל הקונספט כנראה לא ישתנה.

בהצלחה :-)

avatar ענה mmm ב 24 ליולי 2013 #

את הרעיון הבנתי, אבל מה יקרה עם 5000 משתמשים אחרי שנה של פעילות? ומה יקרה במקרה של יותר משתמשים?

avatar ענה matan sh ב 24 ליולי 2013 #

זה למה רשמתי שהדרך האחסון צריכה פיתרון יותר אטרקטיבי,
למרות שנראה לי שאתה פשוט יכול ליצור תבנית שתתקשר באמעות join או פונקציה שתרשום, שתזהה אם הוא חבר או לא.
אז במקום לכתוב 5000 את ההודעה תכתוב פעם אחת שהיא תדע לבד להגיע למי שחבר של אותו אחד שעשה פעולה.

ועוד דבר, אתה יכול כל כמה זמן לקחת את הטבלה ולאחסן את הנתונים שבה בארכיון ואז למחוק את התכולה. זה מה שעושים כל החברות הגדולות ב-31.12 בשעה 23:59

avatar ענה mmm ב 24 ליולי 2013 #

וודאי שאני לא אכניס הכל 5000 פעמים.
ומה ההבדל בין הארכיון למסד הרגיל?

avatar ענה phpon ב 24 ליולי 2013 #

לפי מה שהבנתי לפייסבוק בכלל אין מסד נתונים-היא בנויה בC++
תקנו אותי אם אני טועה.

avatar ענה mmm ב 24 ליולי 2013 #

גם C++ משתמש במסד. ופייסבוק בנויה מPHP וממש מעט ASP.

avatar ענה matan sh ב 24 ליולי 2013 #

ארכיון זה קובץ טקטס לכל דבר שיש בתוכו את כל את כל מה שיש בטבלה (בצורת JSON או בצורת קוד SQL)
ככה שכל סוף שנה או כל תקופה שאתה תבחר, אתה תיצור קובץ חדש ותכניס בו את הנתונים האלה.

ככה של תקופה מסויימת הטבלה שלך תתאפס וכל הנתונים ישארו בקובץ טקסט איפה שהוא בשרת שלך ולא יעשו רע לאף אחד.
כמובן שכל תקופה תהיה קובץ בנפרד.

avatar ענה mmm ב 24 ליולי 2013 #

מצויין, רק כמה שאלות: אחרי הכנסה לארכיון, האם לא ניתן למשתמש לשנות את התוכן? ואם כן ניתן לו, אז למה לא כל הנתונים (הלא סודיים) נמצאים מראש בקובץ כזה?
כשיגש מישהו ל image?id=578 ופרטי הפוסט הזה נמצאים בארכיון, אני אצטרך לבנות קוד שיזהה האם הוא בארכיון או במסד, ולהשתמש בקוד שונה לגמרי עבורם?

avatar ענה matan sh ב 25 ליולי 2013 #

הארכיון לא נועד כדי לשמר קבצים סודיים וככה גם כל הטבלה לא נועדה. הארכיון נועד למקרה שהמשתמש או המנהל ירצה לבדוק משהו. רק אז ואך ורק אז יהיה גישה לארכיון. בעיקרון הארכיון אמור להיות קובץ גלמוד שאף אחד לא משתמש בו והוא קיים רק בשביל זיכרון היסטורי במידה וצץ משהו שצריך להעלות מחדש.

ארכיון הוא קובץ שלא ניתן לשנות (כי לא ניתן לשנות את ההיסטוריה) ולא צריך לעשות איתו כלום רק במקרים קיצוניים.

ושוב, הארכיון נועד שתוכל למחוק את כל מה שיש בטבלה מבלי למחוק לגמריי את התוכן, במידה ותצטרך שוב. ככה זה מקל על ה-DB במקום לאחר ששנתיים לשאול שאילתה בטבלה על 10K שורות, רק על 2K.

avatar ענה mmm ב 25 ליולי 2013 #

עד כאן ברור לי, הבעיה שלי היא שאני אצטרך לבנות קוד חדש לגמרי בשביל לקרוא מהארכיון, וקוד נוסף בשביל לזהות מה בארכיון ומה במסד.

ולגבי הJOIN: - אני אשתמש בו, אבל נניח ויש לי 50 חברים, איך אני יכול לבצע JOIN על 50 מספרי ID?

avatar ענה matan sh ב 25 ליולי 2013 #

1. תעשה את הארכיון ב-JSON,מבטיח לך זה יפתור לך את הבעיה. JSON יכול להפוך בקלות למערך ומשם השמיים הם הגבול.

2. זה הקטע ב-JOIN אתה פשוט מבקש והוא עושה לבד את כל הבדיקות האלה. אתה פשוט צריך לבקש את מטבלת החברים את אותו איידי שממנו נשלחות ההודעות. ממליץ לך לקרוא על זה עוד בקישור הבא: http://w3schools.com/sql/sql_join.asp

avatar ענה mmm ב 25 ליולי 2013 #

1. אז למה לא לבנות את כל האתר מראש על JSON? למה בכלל צריך את המסד (כמובן לא במקרה של ססמאות)
2. קראתי עכשיו על JOIN בWEBMASTER ועכשיו הכל מסתדר לי, תודה רבה על כל העזרה.
3. רק עוד דבר אחד מציק לי, תחשוב על משתמש שעושה "בליץ" של לייקים, ז"א, הוא פשוט עובר תמונה תמונה ועושה לייקים, כדי שלא יוצר מצב שמופיע 10 פעמים "X אהב את התמונה של Y", פייסבוק עושים "X אהב את התמונה של Y ועו 5 תמונות נוספות", יש לך מושג?

avatar ענה matan sh ב 25 ליולי 2013 #

1. מסד זאת פשוט דרך נפוצה לאחסן מידע. איזה מסד? בחירתך המלאה. אתה יכול להשתמש ב-JSON, NOSQL ואפילו MSSQL אם בא לך. רק תבחר!
3. אתה פשוט עושה בדיקה אחרי שהוצאת את המידע, אם יש לאותו משתמש בתקופת זמן מסויימת שאתה מחליט, הרבה לייקים על תמונות, אז אתה משלב בניהם בהודעה.
יותר מזה אני ממליץ לך לעשות את זה רק בהודעה ולא במסד, כדי שלא יווצרו בעיות של שינוי על שינוי ובסוף איפה שאיחסנת פשוט יתחרבש.

avatar ענה mmm ב 25 ליולי 2013 #

תודה רבה לכולם, ובמיוחד ל-matan sh, עזרת לי מאד.

avatar ענה phpon ב 25 ליולי 2013 #

http://en.wikipedia.org/wiki/HipHop_for_PHP

avatar ענה mmm ב 25 ליולי 2013 #

זה עדיין מסד לכל דבר, גם אם הוא מבוסס C++, ודפי האינטרנט שלהם בנויים בPHP.

avatar ענה phpon ב 25 ליולי 2013 #

אבל אין קשר לasp
הקוד PHP מומר לקוד C++ (משהו כזה) והביצועים טובים ב50%

avatar ענה mmm ב 26 ליולי 2013 #

דוקה יש, במרכז מפתחים יש מספר דפים הכתובים בASP, הייתי מביא קישור אם הייתי זוכר איפה זה.